Chương trình C đơn giản Trao đổi khóa Diffie-Hellman

#include <stdio.h>#include <math.h>#include <stdlib.h>#include <time.h>#include <conio.h>int prime(int num) {    int i;    for (i = 2; i*i <= num; ++i)        if (num % i == 0)            return 0;    return 1;}int mod(int base, int expo, int num) {    int res = 1;    int i;    for (i = 1; i <= expo; ++i)        res = (res * base) % num;    return res;}int main() {    int p, g, a, b, i, j, r1, r2, k1, k2, k3;    srand(time(NULL));    p:        printf("\nNhập p và g: (hoặc comment dòng này để tạo giá trị ngẫu nhiên)");        scanf("%d %d", &p, &g);    if (!prime(p) || !prime(g)) {        printf("\nCác giá trị nhập không phải nguyên tố... Vui lòng nhập lại...");        goto p;    } else {        srand(time(NULL));        a = rand() % 50;        b = rand() % 50;        printf("\nSố tạo ngẫu nhiên: %d %d", a, b);        r1 = mod(g, a, p); // g^a mod p        r2 = mod(g, b, p); // g^b mod p        printf("\nR1 = %d\nR2 = %d\n", r1, r2);        k1 = mod(r2, a, p); // r2^a mod p        k2 = mod(r1, b, p); // r1^b mod p        printf("\nKhóa bí mật chung tính được bởi Alice: %d", k1);        printf("\nKhóa bí mật chung tính được bởi Bob: %d", k2);        k3 = mod(g, a * b, p); // g^a*b mod p        printf("\nKiểm tra Khóa bí mật chung: %d", k3); // phải giống k1 và k2    }getch(); // Dừng màn hình để xem kết quả}

Tài liệu tham khảo

WikiPedia: Trao đổi khóa Diffie-Hellman http://www.cacr.math.uwaterloo.ca/hac/ http://cryptocellar.web.cern.ch/cryptocellar/cesg/... http://cryptocellar.web.cern.ch/cryptocellar/cesg/... http://code.google.com/p/sacct/ http://docs.google.com/viewer?a=v&pid=sites&srcid=... http://video.google.com/videoplay?docid=8991737124... http://www.google.com/patents?vid=4.2 http://www.google.com/patents?vid=4200770 http://www.jya.com/ellisdoc.htm http://www.rsasecurity.com/rsalabs/node.asp?id=230...